//阻塞等待
//#include<stdio.h>
//#include<unistd.h>
//#include<sys/types.h>
//#include<sys/wait.h>
//
//int main()
//{
//    int id = fork();//代码创建子进程
//    if(id < 0)
//    {
//        printf("fork error\n");
//    }
//    else if(id == 0)//child
//    {   
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("I am a child process.  my time:%d PID:%d, PPID:%d\n", cnt, getpid(), getppid());
//            cnt--;
//            sleep(1);
//        }
//        exit(1);//子进程退出
//    }
//    //father
//    int status = 0;//状态
//    int ret = waitpid(id, &status, WNOHANG);//参数3为WNOHANG，非阻塞等待
//    if(ret > 0)//等待成功
//    {
//         if(WIFEXITED(status)) 
//         {
//             printf("子进程正常退出了 ret:%d,  exit code:%d,  exit sig:%d\n", ret, WEXITSTATUS(status), status&0x7F);
//         }
//         else 
//         {
//             printf("进程异常了\n");
//         }
//    }
//    else if(ret == 0)
//    {
//		printf("子进程还在运行！\n");
//		printf("我还可以做点其他事儿！\n");
//    }
//    else //等待失败
//    {
//        printf("wait false\n");
//    }
//    return 0;
//}
//
//
//非阻塞轮询
#include <stdio.h> 
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
 
int main()
{
	 int pid = fork();
	 if(pid < 0)
	 {
		 printf("%s fork error\n",__FUNCTION__);
		 return 1;
	 }
	 else if( pid == 0 )//child
	 { 
		 printf("child is run, pid is : %d\n",getpid());
		 sleep(5);
		 exit(1);
	 } 
	 int status = 0;
	 int ret = 0;
	 do
	 {
		ret = waitpid(-1, &status, WNOHANG);//非阻塞式等待
		if( ret == 0 )
		{
            printf("Child is running.");
			printf("I can do other thing\n");
		}
		sleep(1);
	 }while(ret == 0);
	 
	 if( WIFEXITED(status) && ret == pid )
	 {
	 	 printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));
	 }
	 else
	 {
		 printf("wait child failed, return.\n");
		 return 1;
	 }
	 return 0;
}
